import { _decorator, Component, BoxCollider2D, Sprite, color, Label,Node,find,Vec3} from 'cc';
import { buff } from './buff';
const { ccclass, property } = _decorator;
@ccclass('Enemy')
export class Enemy extends Component {
    @property
    public health: number = 100;
    
    // 玩家节点
    PlayerNode : Node = null;
    // buff节点
    buff:Node = null;

    // 敌人移动速度
    public moveSpeed = 100
    // 敌人的攻击力
    public attack = 10
    // 记录敌人生成时的血量，用于计算百分比伤害
    public startHealth = 0
    // 灼烧定时器
    burnTimer = null;

    private collider: BoxCollider2D = null;
    // 敌人抗性(减少击退距离)(初始为1，后续会减少，最少为0.1,最多为2,每个一段时间会自动减少0.1，敌人被击退距离
    // 为 抗性*击退距离)
    public kangxing = 1

    onLoad() {
        this.collider = this.getComponent(BoxCollider2D);
        this.collider.enabled = true;
        // 通过find查找玩家节点，避免敌人预制体挂载该脚本时无法设置玩家Node属性的值
        this.PlayerNode = find('Canvas/me');
        // 记录初始血量
        this.startHealth = this.health
    }

    update(deltaTime: number) {
        // 通过find查找玩家节点，避免敌人预制体挂载该脚本时无法设置玩家Node属性的值
        
        // 获取玩家节点和敌人节点的位置
        const playerPos = this.PlayerNode.position;
        const enemyPos = this.node.position;

        // 计算敌人节点到玩家节点的方向向量
        // 为玩家节点加上克隆可以避免一直重置玩家位置导致无法移动的问题
        const direction = playerPos.clone().subtract(enemyPos);

        // 归一化方向向量
        const normalizedDirection = direction.normalize();

        // 更新敌人节点的位置
        this.node.position = enemyPos.add(normalizedDirection.multiplyScalar(this.moveSpeed * deltaTime));
    }
    // 受到伤害
    takeDamage(damage: number,node,type,ex) {// 收到伤害值，武器节点，武器类型，武器特殊伤害类型
        let percentAttack = 0
        if(ex == "Burning"){// 火球的灼烧
            this.Burning()
            // 敌人每次被添加灼烧效果时会重置掉之前的灼烧定时，会经常出现丢失伤害的问题，那么做出补偿
            // 每次添加灼烧效果时，将扣除敌人当前血量的1%
            percentAttack = Math.floor(this.health * 0.01)
        }else if(ex == '0.03' || ex == '0.02' || ex == '0.01'){// 武器的百分比真伤
            percentAttack = Math.floor(this.startHealth * Number(ex))
            this.health -= percentAttack
        }else{// 未解锁ex技能
            percentAttack = 0
        }
        this.health -= Math.floor(damage)
        // 播放受击动画
        this.playHitAnimation(Math.floor(damage),type,percentAttack);
        // console.log("-10")
        if (this.health <= 0) {
            this.die();
        }
    }
    // 灼烧伤害
    Burning(){// 灼烧伤害是扣除敌人当前生命的10%
        clearInterval(this.burnTimer)
        // 敌人每次被添加灼烧效果时会重置掉之前的灼烧定时，会经常出现丢失伤害的问题，那么做出补偿
        // 每次添加灼烧效果时，将扣除敌人当前血量的1%
        // if(this.node){
        //     this.node.children[0].getComponent(Label).color = color(255,128,0)// 灼烧伤害颜色，橙色
        //     setTimeout(() => {
        //         if(this.node){
        //             this.node.children[0].getComponent(Label).string = ``
        //         }
        //     }, 200);
        // }
        // if(this.node){
        //     this.node.getComponent(Sprite).color = color(255,128,0)
        //     setTimeout(() => {
        //         if(this.node){
        //             this.node.getComponent(Sprite).color = color(255,255,255)
        //         }
        //     }, 200);
        // }
        // if(this.node){// 每秒灼烧伤害为当前生命的5%
        //     this.node.children[0].getComponent(Label).string = `-${Math.floor(this.health * .01)}`
        // }
        let nums = 0
        this.burnTimer = setInterval(() => {
            if(!this.node)return
            if(nums >= 5){// 持续5秒的灼烧
                clearInterval(this.burnTimer)
            }
            if(!this.node){
                clearInterval(this.burnTimer)
            }
            if(this.node){
                this.node.children[0].getComponent(Label).color = color(255,128,0)// 灼烧伤害颜色，橙色
                setTimeout(() => {
                    if(this.node){
                        this.node.children[0].getComponent(Label).string = ``
                    }
                }, 200);
            }
            if(this.node){
                this.node.getComponent(Sprite).color = color(255,128,0)
                setTimeout(() => {
                    if(this.node){
                        this.node.getComponent(Sprite).color = color(255,255,255)
                    }
                }, 200);
            }
            if(this.node){// 每秒灼烧伤害为当前生命的5%
                this.node.children[0].getComponent(Label).string = `-${Math.floor(this.health * .05)}`
            }
            if(this.node){
                this.health -= Math.floor(this.health * .1)
            }
            // 烧死了就销毁节点
            if (this.health <= 0) {
                this.die();
                clearInterval(this.burnTimer)
            }
            // 灼烧次数加1
            nums+=1
        }, 1000);
    }
    private playHitAnimation(damage,type,percentAttack) {
        // 播放受击动画或效果
        if(type == 'physics'){// 物理伤害
            this.node.children[0].getComponent(Label).color = color(255,0,0)
            this.node.getComponent(Sprite).color = color(255,0,0)
        }else if(type == 'magic'){// 法术伤害
            this.node.children[0].getComponent(Label).color = color(0,0,255)
            this.node.getComponent(Sprite).color = color(0,0,255)
        }
        this.node.children[0].getComponent(Label).string = `-${damage+percentAttack}`
        // 敌人被击退
        // const enemyPos = this.node.position.clone();
        // const attackerPos = node.position.clone();
        // attackerPos.y-=600
        // 玩家和敌人的世界坐标
        let playerWPos = this.PlayerNode.getWorldPosition().clone()
        let enemyWPos = this.node.getWorldPosition().clone()
        // console.log(playerWPos,'玩家位置')
        // console.log(enemyWPos,'敌人位置')
        // 计算击退方向（从攻击者指向敌人）
        // let dir = enemyPos.subtract(attackerPos).normalize();
        // this.node.eulerAngles = new Vec3(0, 0,node.eulerAngles)
        // 通过判断玩家和敌人世界坐标的位置左右高低来设置敌人被"击退的方向"
        // 击退距离为 抗性*击退距离
        let jitui = this.moveSpeed/4*this.kangxing
        if(playerWPos.x < enemyWPos.x && playerWPos.y <= enemyWPos.y){// 敌人在玩家右上方
            this.node.setWorldPosition(enemyWPos.x+jitui,enemyWPos.y+jitui,0)
        }else if(playerWPos.x < enemyWPos.x && playerWPos.y > enemyWPos.y){// 敌人在玩家右下方
            this.node.setWorldPosition(enemyWPos.x+jitui,enemyWPos.y-jitui,0)
        }else if(playerWPos.x > enemyWPos.x && playerWPos.y <= enemyWPos.y){// 敌人在玩家左上方
            this.node.setWorldPosition(enemyWPos.x-jitui,enemyWPos.y+jitui,0)
        }else{// 敌人在玩家左下方
            this.node.setWorldPosition(enemyWPos.x-jitui,enemyWPos.y-jitui,0)
        }
        // 击退位移
        // this.node.setPosition(enemyPos.add(dir.multiplyScalar(this.moveSpeed)));
        
        setTimeout(()=>{
            if(this.node){
                this.node.getComponent(Sprite).color = color(255,255,255)
                this.node.children[0].getComponent(Label).string = ``
            }
        },200)
    }

    private die() {
        // 死亡处理
        if(!this.node){
            clearInterval(this.burnTimer)
            return
        }
        if(this.node){
            this.node.destroy();
        }
        this.buff = find('Canvas/buff')
        this.buff.getComponent(buff).level()
    }
}